package cn.zcy.handler.impl;

import cn.zcy.handler.ResultSetHandler;

import java.beans.PropertyDescriptor;
import java.lang.reflect.Method;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;

public class BeanHandler<T> implements ResultSetHandler {

    //定义分装到那个类的字节码
    private Class<T> requiredType;

    public BeanHandler(Class requiredType) {
        this.requiredType = requiredType;
    }

    /**
     * @param resultSet
     * @return
     */
    @Override
    public Object handle(ResultSet resultSet) {
        //定义返回值
        T bean =null;
        try {
            //判断是否有结果结
            if (resultSet.next()){
             //实例化返回对象 ,反射
                bean= requiredType.newInstance();
                //获取结果集的源信息
                ResultSetMetaData metaData = resultSet.getMetaData();
                //获取结果集的列数
                int columnCount = metaData.getColumnCount();
                for (int i = 0; i < columnCount; i++) {
                    //取出列的标题
                    String columnLabel = metaData.getColumnLabel(i + 1);
                    //取出数据内容
                    Object value = resultSet.getObject(columnLabel);
                    //借助java的内省机制，属性填充器
                    PropertyDescriptor pd = new PropertyDescriptor(columnLabel,requiredType);
                    //获取写方法
                    Method method = pd.getWriteMethod();

                    // 获取参数类型
                    Class<?> paramType = method.getParameterTypes()[0];
                    Object convertedValue = convertValue(value, paramType); // 转换值
                    //执行方法
                    method.invoke(bean,convertedValue);

                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

        return bean;
    }

    // 值转换方法
    private Object convertValue(Object value, Class<?> paramType) {
        if (value == null) {
            return null;
        }
        if (paramType == Integer.class) {
            return Integer.valueOf(value.toString());
        } else if (paramType == Double.class) {
            return Double.valueOf(value.toString());
        } else if (paramType == String.class) {
            return value.toString();
        }
        // 添加其他类型的转换
        return value; // 默认返回原值
    }
}
